﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Data;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using produccion.modelo;
using produccion.clases;
using produccion.Conexion;
using produccion.reportes;
using Oracle.DataAccess.Client;


namespace produccion.modulos
{
    public interface IFactura
    {
        void ImprimirDatos(string strNroFactura, string strImpresora, out string strMensaje, short numCopias, bool logPreviewPDF, bool logAnulada);
    }
    
    [Export(typeof(IFactura))]
    public class ImprimirFactura:IFactura
    {
        public static string strBaseDatos;

        #region Campos
            private int numPaginaActual = 1;
            private PrintDocument _print = new PrintDocument();            
            private DataSet _dts;
            private int _numCopias = 0;
            private bool _logPreviewPDF = false;
            private bool _logAnulada = false;
            private int numColumna = 0;
            private int numFila = 0;
            private int numProductos = 0;
            private int numPaginas = 0;
            private int numCuentaLinea = 0;
            private Int32 numTotalProductos = 0;
            private Int32 numPREPRO_DODAnterior = 0;
            private string strPedidos = "";
            private string strOrdenes = "";
            private string strPedidosCliente = "";
            private string strReferencia = "";

            MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

            DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
            String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
            String StrDatoRetornado;//FJRF - Para los datos retornados
            Double DblValorRetornado;//FJRF - Para los valores retornados
        #endregion

        #region Constructor
            [ImportingConstructor]
            public ImprimirFactura()
            {
                _print.PrintPage += _print_PrintPage;
            }
        #endregion

        #region Metodos
            public void ImprimirDatos(string strNroFactura, string strImpresora, out string strMensaje, short numCopias, bool logPreviewPDF, bool logAnulada)
            {
                try
                {
                    OracleConexion oc = new OracleConexion(strBaseDatos);      
                    var r1 = new OracleParameter("p_strFactura", OracleDbType.Varchar2, strNroFactura, ParameterDirection.Input);
                    var r2 = new OracleParameter("p_ResultSet", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r3 = new OracleParameter("p_ResultSet2", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r4 = new OracleParameter("p_ResultSet3", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r5 = new OracleParameter("p_ResultSet4", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r6 = new OracleParameter("p_ResultSet5", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r7 = new OracleParameter("p_ResultSet6", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r8 = new OracleParameter("p_ResultSet7", OracleDbType.RefCursor, ParameterDirection.Output);
                    var r9 = new OracleParameter("p_ResultSet8", OracleDbType.RefCursor, ParameterDirection.Output);
                    var parametros = new List<OracleParameter> { r1, r2, r3, r4, r5, r6, r7, r8, r9 };
                    DataSet dts = oc.EjecutarSp<DataSet>("SP_IMPRIMEFACTURA", parametros);

                    if (dts != null)
                    {
                        if (dts.Tables.Count > 5)
                        {
                            _dts = dts;
                            _numCopias = numCopias;
                            _logPreviewPDF = logPreviewPDF;
                            _logAnulada = logAnulada;
                            _print.DefaultPageSettings.PaperSize = new PaperSize("letter", 850, 1100);
                            //_print.PrinterSettings.Duplex = Duplex.Simplex;
                            _print.PrinterSettings.PrinterName = strImpresora;
                            _print.PrinterSettings.Copies = numCopias;
                            _print.PrintController = new StandardPrintController();
                            _print.Print();
                            strMensaje = "";
                        }
                        else
                        {
                            strMensaje = "No hay datos para cargar.";
                        }
                    }
                    else
                    {
                        strMensaje = "No hay datos para cargar.";
                    }
                }
                catch (Exception ex) 
                { 
                    strMensaje = ex.Message;
                }
            }

            private void imprimirPDF()
            {
                #region Crea dataset y datatables para el reporte y variables                
                DataSet ds = new DataSet("dsFactura");

                DataTable dtEmpresa = new DataTable("dtEmpresa");
                DataTable dtCliente = new DataTable("dtCliente");
                DataTable dtEncFactura = new DataTable("dtEncFactura");
                DataTable dtTallas = new DataTable("dtTallas");
                
                DataTable dtOrdenes = new DataTable("dtOrdenes");
                DataTable dtPedidos = new DataTable("dtPedidos");
                DataTable dtPedidosCliente = new DataTable("dtPedidosCliente");
                DataTable dtDetFactura = new DataTable("dtDetFactura");

                Int32 numTotaldeArticulos = 0;
                Int32 numSubtotalFactura = 0;
                string strNumFactura = "";
                #endregion

                #region Llena los data tables que no requieren recorrer la tabla
                dtEmpresa = _dts.Tables[0];
                dtEmpresa.TableName = "dtEmpresa";
                dtCliente = _dts.Tables[1];
                dtCliente.TableName = "dtCliente";                

                dtOrdenes.TableName = "dtOrdenes";
                dtOrdenes.Columns.Add("NROORD_EOD", System.Type.GetType("System.String"));
                DataRow drOrdenes = dtOrdenes.NewRow();
                string strOrdenes = "";

                if (_dts.Tables[2].Rows.Count > 0)
                {
                    foreach (DataRow dr in _dts.Tables[2].Rows)
                    {
                        strOrdenes = strOrdenes + dr[0].ToString().Trim() + ",";
                    }
                    strOrdenes = strOrdenes.Substring(0, strOrdenes.Length - 1);
                }
                drOrdenes["NROORD_EOD"] = strOrdenes;
                dtOrdenes.Rows.Add(drOrdenes);

                dtPedidos.TableName = "dtPedidos";
                dtPedidos.Columns.Add("NROPED_EOP", System.Type.GetType("System.String"));
                DataRow drPedidos = dtPedidos.NewRow();
                string strPedidos = "";

                if (_dts.Tables[3].Rows.Count > 0)
                {
                    foreach (DataRow dr in _dts.Tables[3].Rows)
                    {
                        strPedidos = strPedidos + dr[0].ToString().Trim() + ",";
                    }
                    strPedidos = strPedidos.Substring(0, strPedidos.Length - 1);
                }
                drPedidos["NROPED_EOP"] = strPedidos;
                dtPedidos.Rows.Add(drPedidos);
                
                dtPedidosCliente.TableName = "dtPedidosCliente";
                dtPedidosCliente.Columns.Add("PEDORI_EPC", System.Type.GetType("System.String"));
                DataRow drPedidosCliente = dtPedidosCliente.NewRow();
                string strPedidosCliente = "";

                if (_dts.Tables[4].Rows.Count > 0)
                {
                    foreach (DataRow dr in _dts.Tables[4].Rows)
                    {
                        strPedidosCliente = strPedidosCliente + dr[0].ToString().Trim() + ",";
                    }
                    strPedidosCliente = strPedidosCliente.Substring(0, strPedidosCliente.Length - 1);
                }
                drPedidosCliente["PEDORI_EPC"] = strPedidosCliente;
                dtPedidosCliente.Rows.Add(drPedidosCliente);
                #endregion

                #region tabla encabezado de tallas                
                dtTallas.TableName = "dtTallas";
                dtTallas.Columns.Add("CODTAL", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T1", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T2", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T3", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T4", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T5", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T6", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T7", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T8", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T9", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T10", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T11", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T12", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T13", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T14", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T15", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T16", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T17", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T18", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T19", System.Type.GetType("System.String"));
                dtTallas.Columns.Add("T20", System.Type.GetType("System.String"));

                string strCodigo = _dts.Tables[6].Rows[0]["CODTJE_TAL"].ToString().Trim();
                DataRow drTallas = dtTallas.NewRow();
                int numCantidad = _dts.Tables[6].Rows.Count;

                if (_dts.Tables[7].Rows.Count > 0)
                {
                    foreach (DataRow dr in _dts.Tables[6].Rows)
                    {
                        if (strCodigo == dr["CODTJE_TAL"].ToString().Trim())
                        {
                            drTallas["CODTAL"] = dr["CODTJE_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 1)
                                drTallas["T1"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 2)
                                drTallas["T2"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 3)
                                drTallas["T3"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 4)
                                drTallas["T4"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 5)
                                drTallas["T5"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 6)
                                drTallas["T6"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 7)
                                drTallas["T7"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 8)
                                drTallas["T8"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 9)
                                drTallas["T9"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 10)
                                drTallas["T10"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 11)
                                drTallas["T11"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 12)
                                drTallas["T12"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 13)
                                drTallas["T13"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 14)
                                drTallas["T14"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 15)
                                drTallas["T15"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 16)
                                drTallas["T16"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 17)
                                drTallas["T17"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 18)
                                drTallas["T18"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 19)
                                drTallas["T19"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 20)
                                drTallas["T20"] = dr["CODTAL_TAL"].ToString().Trim();
                        }
                        else
                        {
                            
                            dtTallas.Rows.Add(drTallas);
                            strCodigo = dr["CODTJE_TAL"].ToString().Trim();
                            drTallas["CODTAL"] = dr["CODTJE_TAL"].ToString().Trim();
                            drTallas = dtTallas.NewRow();

                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 1)
                                drTallas["T1"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 2)
                                drTallas["T2"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 3)
                                drTallas["T3"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 4)
                                drTallas["T4"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 5)
                                drTallas["T5"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 6)
                                drTallas["T6"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 7)
                                drTallas["T7"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 8)
                                drTallas["T8"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 9)
                                drTallas["T9"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 10)
                                drTallas["T10"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 11)
                                drTallas["T11"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 12)
                                drTallas["T12"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 13)
                                drTallas["T13"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 14)
                                drTallas["T14"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 15)
                                drTallas["T15"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 16)
                                drTallas["T16"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 17)
                                drTallas["T17"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 18)
                                drTallas["T18"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 19)
                                drTallas["T19"] = dr["CODTAL_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 20)
                                drTallas["T20"] = dr["CODTAL_TAL"].ToString().Trim();
                        }
                    }

                    dtTallas.Rows.Add(drTallas);

                }
                #endregion

                #region Detalle de facturas                
                dtDetFactura.TableName = "dtDetFactura";
                dtDetFactura.Columns.Add("CODTAL_DOD", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("REFERENCIA", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("NOMREF_REF", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("NOMCOL_COL", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("PREPRO_DOD", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("CODTJE_TAL", System.Type.GetType("System.String"));
                dtDetFactura.Columns.Add("T1", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T2", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T3", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T4", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T5", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T6", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T7", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T8", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T9", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T10", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T11", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T12", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T13", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T14", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T15", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T16", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T17", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T18", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T19", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("T20", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("TOTALUNIDADES", System.Type.GetType("System.Int32"));
                dtDetFactura.Columns.Add("TOTAL", System.Type.GetType("System.Int32"));

                string strRef = "", strNumeroFactura = "";//FJRF - Creamos las variables para poder hacer el filtro segun el tipo
                strNumeroFactura = _dts.Tables[5].Rows[0]["NROFAC_EFA"].ToString().Trim();//FJRF - Extraemos el numero de la factura

                String StrTipoOrden = MdoGeneral.StrRetornarUnSoloCampo("min(tipord_eod)", "Tipo", "encordd", "nrodes_eod = '" + strNumeroFactura + "'");//FJRF - Miramos que tipo de factura es
                if (StrTipoOrden == "S" || StrTipoOrden == "G")//FJRF - Si son servicios o garantias hacemos lo siguiente
                {
                    strRef = _dts.Tables[7].Rows[0]["REFERENCIA"].ToString().Trim() + _dts.Tables[7].Rows[0]["CODTAL_DOD"].ToString().Trim();//FJRF - la referencia a buscar le ponemos la talla para q nunca la encuentre y no agrupe los datos
                }
                else//FJRF - si no es garantia o servicio lo dejamos como estaba
                {
                    strRef = _dts.Tables[7].Rows[0]["REFERENCIA"].ToString().Trim();//FJRF - Asi estaba antes de la condicion
                }
                
                Int32 numTotalUnidades = 0;
                Int32 numTotal = 0;
                DataRow drDetFactura = dtDetFactura.NewRow();

                if (_dts.Tables[7].Rows.Count > 0)
                {
                    foreach (DataRow dr in _dts.Tables[7].Rows)
                    {
                        if (strRef == dr["REFERENCIA"].ToString().Trim())
                        {
                            drDetFactura["CODTAL_DOD"] = dr["CODTAL_DOD"].ToString().Trim();
                            drDetFactura["REFERENCIA"] = dr["REFERENCIA"].ToString().Trim();
                            drDetFactura["NOMREF_REF"] = dr["NOMREF_REF"].ToString().Trim();
                            drDetFactura["NOMCOL_COL"] = dr["NOMCOL_COL"].ToString().Trim();
                            drDetFactura["PREPRO_DOD"] = dr["PREPRO_DOD"].ToString().Trim();
                            drDetFactura["CODTJE_TAL"] = dr["CODTJE_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 1)
                            {
                                drDetFactura["T1"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 2)
                            {
                                drDetFactura["T2"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 3)
                            {
                                drDetFactura["T3"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 4)
                            {
                                drDetFactura["T4"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 5)
                            {
                                drDetFactura["T5"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 6)
                            {
                                drDetFactura["T6"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 7)
                            {
                                drDetFactura["T7"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 8)
                            {
                                drDetFactura["T8"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 9)
                            {
                                drDetFactura["T9"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 10)
                            {
                                drDetFactura["T10"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 11)
                            {
                                drDetFactura["T11"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 12)
                            {
                                drDetFactura["T12"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 13)
                            {
                                drDetFactura["T13"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 14)
                            {
                                drDetFactura["T14"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 15)
                            {
                                drDetFactura["T15"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 16)
                            {
                                drDetFactura["T16"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 17)
                            {
                                drDetFactura["T17"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 18)
                            {
                                drDetFactura["T18"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 19)
                            {
                                drDetFactura["T19"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 20)
                            {
                                drDetFactura["T20"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                        }
                        else
                        {
                            drDetFactura["TOTALUNIDADES"] = numTotalUnidades;
                            drDetFactura["TOTAL"] = numTotal;

                            numTotaldeArticulos = numTotaldeArticulos + numTotalUnidades;
                            numSubtotalFactura = numSubtotalFactura + numTotal;

                            dtDetFactura.Rows.Add(drDetFactura);
                            

                            if (StrTipoOrden == "S" || StrTipoOrden == "G")//FJRF - Si es garantia o servicio hacemos lo siguiente
                            {
                                strRef = dr["REFERENCIA"].ToString().Trim() + dr["CODTAL_DOD"].ToString().Trim();//FJRF - Le ponemos la talla para q nunca lo encuentre
                            }
                            else//FJRF -si no es garantia ni servicio hacemos lo siguiente
                            {
                                strRef = dr["REFERENCIA"].ToString().Trim();//FJRF - Asi estaba antes de la condicion
                            }


                            drDetFactura = dtDetFactura.NewRow();
                            numTotalUnidades = 0;
                            numTotal = 0;

                            drDetFactura["CODTAL_DOD"] = dr["CODTAL_DOD"].ToString().Trim();
                            drDetFactura["REFERENCIA"] = dr["REFERENCIA"].ToString().Trim();
                            drDetFactura["NOMREF_REF"] = dr["NOMREF_REF"].ToString().Trim();
                            drDetFactura["NOMCOL_COL"] = dr["NOMCOL_COL"].ToString().Trim();
                            drDetFactura["PREPRO_DOD"] = dr["PREPRO_DOD"].ToString().Trim();
                            drDetFactura["CODTJE_TAL"] = dr["CODTJE_TAL"].ToString().Trim();
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 1)
                            {
                                drDetFactura["T1"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 2)
                            {
                                drDetFactura["T2"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 3)
                            {
                                drDetFactura["T3"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 4)
                            {
                                drDetFactura["T4"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 5)
                            {
                                drDetFactura["T5"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 6)
                            {
                                drDetFactura["T6"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 7)
                            {
                                drDetFactura["T7"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 8)
                            {
                                drDetFactura["T8"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 9)
                            {
                                drDetFactura["T9"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 10)
                            {
                                drDetFactura["T10"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 11)
                            {
                                drDetFactura["T11"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 12)
                            {
                                drDetFactura["T12"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 13)
                            {
                                drDetFactura["T13"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 14)
                            {
                                drDetFactura["T14"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 15)
                            {
                                drDetFactura["T15"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 16)
                            {
                                drDetFactura["T16"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 17)
                            {
                                drDetFactura["T17"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 18)
                            {
                                drDetFactura["T18"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 19)
                            {
                                drDetFactura["T19"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                            if (Convert.ToInt32(dr["POSTAL_TAL"]) == 20)
                            {
                                drDetFactura["T20"] = Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotalUnidades = numTotalUnidades + Convert.ToInt32(dr["CANPRO_DOD"]);
                                numTotal = numTotal + (Convert.ToInt32(dr["CANPRO_DOD"]) * Convert.ToInt32(dr["PREPRO_DOD"]));
                            }
                        }
                    }

                    drDetFactura["TOTALUNIDADES"] = numTotalUnidades;
                    drDetFactura["TOTAL"] = numTotal;

                    numTotaldeArticulos = numTotaldeArticulos + numTotalUnidades;
                    numSubtotalFactura = numSubtotalFactura + numTotal;

                    dtDetFactura.Rows.Add(drDetFactura);

                }
                #endregion

                #region Encabezado de factura                
                dtEncFactura.TableName = "dtEncFactura";
                dtEncFactura.Columns.Add("NROFAC_EFA", System.Type.GetType("System.String"));
                dtEncFactura.Columns.Add("FECFAC_EFA", System.Type.GetType("System.DateTime"));
                dtEncFactura.Columns.Add("VTOFAC_EFA", System.Type.GetType("System.DateTime"));
                dtEncFactura.Columns.Add("VALFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("IVAFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("RTEFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("DTOFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("ABOFAC_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("FLETE_EFA", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("STRVALOR", System.Type.GetType("System.String"));
                dtEncFactura.Columns.Add("STRRESOLUCION", System.Type.GetType("System.String"));
                dtEncFactura.Columns.Add("NUMUNIDADES", System.Type.GetType("System.Int32"));
                dtEncFactura.Columns.Add("NUMSUBTOTAL", System.Type.GetType("System.Int32"));

                dtEncFactura.TableName = "dtEncFactura";
                DataRow drEncFactura = dtEncFactura.NewRow();
                drEncFactura["NROFAC_EFA"] = _dts.Tables[5].Rows[0]["NROFAC_EFA"].ToString();
                strNumFactura = _dts.Tables[5].Rows[0]["NROFAC_EFA"].ToString();
                drEncFactura["FECFAC_EFA"] = Convert.ToString(_dts.Tables[5].Rows[0]["FECFAC_EFA"]);
                drEncFactura["VTOFAC_EFA"] = Convert.ToString(_dts.Tables[5].Rows[0]["VTOFAC_EFA"]);
                drEncFactura["VALFAC_EFA"] = Convert.ToInt32(_dts.Tables[5].Rows[0]["VALFAC_EFA"]);
                drEncFactura["IVAFAC_EFA"] = Convert.ToInt32(_dts.Tables[5].Rows[0]["IVAFAC_EFA"]);
                drEncFactura["RTEFAC_EFA"] = Convert.ToInt32(_dts.Tables[5].Rows[0]["RTEFAC_EFA"]);
                drEncFactura["DTOFAC_EFA"] = Convert.ToInt32(_dts.Tables[5].Rows[0]["DTOFAC_EFA"]);
                drEncFactura["ABOFAC_EFA"] = Convert.ToInt32(_dts.Tables[5].Rows[0]["ABOFAC_EFA"]);
                drEncFactura["FLETE_EFA"] = Convert.ToInt32(_dts.Tables[5].Rows[0]["FLETE_EFA"]);
                drEncFactura["STRVALOR"] = _dts.Tables[5].Rows[0]["STRVALOR"].ToString();
                drEncFactura["STRRESOLUCION"] = _dts.Tables[5].Rows[0]["STRRESOLUCION"].ToString();
                drEncFactura["NUMUNIDADES"] = numTotaldeArticulos;
                drEncFactura["NUMSUBTOTAL"] = numSubtotalFactura;

                dtEncFactura.Rows.Add(drEncFactura);
                #endregion

                ds.Tables.Add(dtEmpresa.Copy());
                ds.Tables.Add(dtCliente.Copy());
                ds.Tables.Add(dtEncFactura.Copy());
                ds.Tables.Add(dtTallas.Copy());
                ds.Tables.Add(dtOrdenes);
                ds.Tables.Add(dtPedidos);
                ds.Tables.Add(dtPedidosCliente);
                ds.Tables.Add(dtDetFactura);

                if (_logPreviewPDF == true)
                {
                    if (_logAnulada == true)
                    {
                        Vista vista = new Vista { ds = ds, reporte = @"reportes\rptFacturaAnulada.rpt" };
                        vista.Show();
                    }
                    else
                    {
                        Vista vista = new Vista { ds = ds, reporte = @"reportes\rptFactura.rpt" };
                        vista.Show();
                    }
                }
                else
                {
                    String StrNombreOriginal, StrRutaExporta, StrNombreNuevo, StrExtencionArchivo = "";
                    StrExtencionArchivo = "pdf";
                    StrNombreNuevo = strNumFactura;
                    StrNombreOriginal = @"reportes\rptFactura.rpt";// Asignamos la ruta donde esta el reporte origina que se va a cargar
                    StrRutaExporta = @"\\10.1.1.7\publica\Artesa\FACTURAS\";// Asignamos la ruta donde se exportara el archivo

                    if (File.Exists(StrRutaExporta + StrNombreNuevo + "." + StrExtencionArchivo))
                    {
                        foreach (Process proceso in Process.GetProcesses())
                        {
                            if (proceso.ProcessName == "glcnd" || proceso.ProcessName == "AcroRd32")
                            {
                                proceso.Kill();
                            }
                        }
                        File.Delete(StrRutaExporta + StrNombreNuevo + "." + StrExtencionArchivo);
                    }

                    if (_logAnulada == true)
                    {
                        StrNombreOriginal = @"reportes\rptFacturaAnulada.rpt";// Asignamos la ruta donde esta el reporte origina que se va a cargar
                        Vista FrmReporte = new Vista();// Cargamos las clases que necesitamos que estan en este formulario
                        FrmReporte.ExportarCrystalReport(ds, StrNombreOriginal, StrRutaExporta, StrNombreNuevo, StrExtencionArchivo);// Enviamos la impresion
                    }
                    else
                    {
                        Vista FrmReporte = new Vista();// Cargamos las clases que necesitamos que estan en este formulario
                        FrmReporte.ExportarCrystalReport(ds, StrNombreOriginal, StrRutaExporta, StrNombreNuevo, StrExtencionArchivo);// Enviamos la impresion
                    }

                    
                }

            }
            Int32 IntTotalArticulos = 0;//FJRF - Para tener el numero total de articulos
            private void imprimirPagina1(PrintPageEventArgs e)
            {
                if (_numCopias > 0)
                {

                    #region variables
                    var dtEmpresa = _dts.Tables[0];
                    var dtCliente = _dts.Tables[1];
                    var dtOrdenes = _dts.Tables[2];
                    var dtPedidos = _dts.Tables[3];
                    var dtPedidosCliente = _dts.Tables[4];
                    var dtEncFactura = _dts.Tables[5];
                    var dtTallas = _dts.Tables[6];
                    var dtDetFactura = _dts.Tables[7];

                    int fontsize = 6;
                    var xbrushes = Brushes.Black;
                    var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                    var fuentenormal = new Font("Tahoma", fontsize);
                    var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                    var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                    var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                    var fuentelistadetalle = new Font("Arial", 5);
                    var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                    var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                    string strCodtalla = "";
                    int numCantidadTallas = 0;
                    int numLargoTitulo = 0;
                    int numGuardaFila = 0;
                    int numRepite = 0;
                    int numPar = 0;
                    Int32 numArticulos = 0;
                    int numContadorCol = 0;
                    int numCuantos = 0;
                    int numTamañoRef = 0;
                    bool logTallasOK = false;
                    int numIzquierda = 550; //560

                    StringFormat formato1 = new StringFormat();
                    formato1.Alignment = StringAlignment.Far;
                    formato1.LineAlignment = StringAlignment.Far;
                    #endregion

                    #region calculos y llena variables
                    // cuenta las tallas
                    foreach (DataRow dr in dtTallas.Rows)
                    {
                        if (dr["CODTJE_TAL"].ToString().Trim() != strCodtalla)
                        {
                            numCantidadTallas++;
                            strCodtalla = dr["CODTJE_TAL"].ToString().Trim();
                        }
                    }
                    // cuenta los productos
                    foreach (DataRow dr in dtDetFactura.Rows)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString().Trim())
                        {
                            strReferencia = dr["REFERENCIA"].ToString().Trim();
                            numProductos++;
                        }
                    }

                    if (dtPedidos.Rows.Count > 0)
                    {
                        // Acumula los pedidos de artesa en una variable
                        foreach (DataRow dr in dtPedidos.Rows)
                        {
                            strPedidos = strPedidos + dr["NROPED_EOP"].ToString() + ", ";
                        }
                        strPedidos = strPedidos.Substring(0, strPedidos.Length - 2);
                    }

                    if (dtOrdenes.Rows.Count > 0)
                    {
                        // Acumula las ordenes del pedido en una variable 
                        foreach (DataRow dr in dtOrdenes.Rows)
                        {
                            strOrdenes = strOrdenes + dr["NROORD_EOD"].ToString() + ", ";
                        }
                        strOrdenes = strOrdenes.Substring(0, strOrdenes.Length - 2);
                    }

                    if (dtPedidosCliente.Rows.Count > 0)
                    {
                        //Acumula las ordenes del cliente en una variable
                        foreach (DataRow dr in dtPedidosCliente.Rows)
                        {
                            strPedidosCliente = strPedidosCliente + dr["PEDORI_EPC"].ToString() + ", ";
                        }
                        strPedidosCliente = strPedidosCliente.Substring(0, strPedidosCliente.Length - 2);
                    }

                    // averigua el numero de páginas
                    if (numProductos > 0 && numProductos < 39)
                        numPaginas = 1;
                    if (numProductos > 38 && numProductos < 89)
                        numPaginas = 2;
                    if (numProductos > 88 && numProductos < 139)
                        numPaginas = 3;
                    if (numProductos > 138 && numProductos < 189)
                        numPaginas = 4;
                    if (numProductos > 188 && numProductos < 227)
                        numPaginas = 5;
                    #endregion

                    #region encabezado
                    // Imprime el logo
                    Image logo = Properties.Resources.artesalogo;
                    e.Graphics.DrawImage(logo, 8, 10);

                    // Titulo factura con numero
                    e.Graphics.FillRectangle(Brushes.LightGray, numIzquierda, 20, 220, 40); //560, 20, 220, 40
                    e.Graphics.DrawString("FACTURA DE VENTA", fuentegrande, xbrushes, 590, 23); //600, 23
                    e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 635, 40); //645, 40

                    // Control de paginacion
                    e.Graphics.DrawString("Página:   1  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 695, 65); //705, 65

                    // Cuadro superior derecho
                    e.Graphics.DrawRectangle(pen, new Rectangle(numIzquierda, 85, 220, 33)); //560, 85, 220, 33
                    e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                    e.Graphics.DrawLine(pen, numIzquierda, 96, 770, 96); //560,96,780,96
                    e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                    e.Graphics.DrawLine(pen, numIzquierda, 107, 770, 107); //560, 107, 780, 107
                    e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                    #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                    DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                    DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                    DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                    TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                    int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                    #endregion

                    e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                    e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                    //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                    e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                    e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                    // Informacion empresa en la parte superior izquierda
                    e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                    e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                    e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                    e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                    // Cuado izquierdo vendido a
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                    e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                    e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                    e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                    e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                    e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString().Trim(), fuentetitulo, xbrushes, 90, 173);
                    //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                    e.Graphics.DrawString("VIA:", fuentetitulo, xbrushes, 90, 183);

                    // Cuadro derecho pedidos y ordenes
                    e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 375, 60)); //395, 140, 385, 60
                    e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                    e.Graphics.DrawLine(pen, 395, 160, 770, 160); //395, 160, 780, 160
                    e.Graphics.DrawString("PEDIDOS CLIENTE: " + strPedidosCliente, fuentetitulo, xbrushes, 400, 165);
                    e.Graphics.DrawLine(pen, 395, 180, 770, 180);
                    if (strOrdenes.Length < 60)
                    {
                        e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 185);
                    }
                    else
                    {
                        e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 60), fuentetitulo, xbrushes, 400, 185);
                        //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                        //e.Graphics.DrawString(strOrdenes.Substring(61), fuentetitulo, xbrushes, 400, 185);
                    }



                    #endregion

                    #region Titulos del Detalle factura
                    //Encabezado de items de la factura
                    numLargoTitulo = (numCantidadTallas * 10) + 20;
                    e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 765, numLargoTitulo);
                    e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 220);
                    e.Graphics.DrawLine(pen, 55, 210, 55, 210 + numLargoTitulo);
                    e.Graphics.DrawString("Referencia", fuentetitulo, xbrushes, 75, 220);
                    e.Graphics.DrawLine(pen, 150, 210, 150, 210 + numLargoTitulo);
                    e.Graphics.DrawString("Color", fuentetitulo, xbrushes, 155, 220);
                    e.Graphics.DrawLine(pen, 200, 210, 200, 210 + numLargoTitulo);

                    // Imprime dinamicamente los diferentes tipos de tallas
                    numFila = 200;
                    foreach (DataRow dr in dtTallas.Rows)
                    {
                        if (dr["POSTAL_TAL"].ToString() == "1")
                        {
                            if (numRepite > 1)
                            {
                                if (numContadorCol == 20)
                                    logTallasOK = true;
                                if (numContadorCol > numCuantos)
                                    numCuantos = numContadorCol;
                                numContadorCol = 0;
                                e.Graphics.DrawLine(pen, numColumna, 226 + (20 * (numRepite - 1)), 620, 226 + (20 * (numRepite - 1)));
                            }
                            numRepite++;
                            numColumna = 200;
                            numFila = numFila + 15;
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentetitulo, xbrushes, numColumna + 3, numFila);
                            numColumna = numColumna + 20;
                            e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                        }
                        e.Graphics.DrawString(dr["CODTAL_TAL"].ToString().PadLeft(3, ' '), fuentetitulo, xbrushes, numColumna + 1, numFila);
                        numColumna = numColumna + 20;
                        if (numRepite == 1)
                            e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                        numContadorCol++;
                    }

                    if (numContadorCol == 20)
                        logTallasOK = true;

                    if (numContadorCol > numCuantos && logTallasOK == false)
                        numCuantos = numContadorCol;

                    if (numRepite == 1)
                        e.Graphics.DrawLine(pen, 200, 226, 620, 226);

                    if (logTallasOK == false)
                    {
                        for (int i = numCuantos; i < 20; i++)
                        {
                            numColumna = numColumna + 20;
                            e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                        }
                    }

                    // Parte final del encabezado de items de la factura
                    e.Graphics.DrawString("Total", fuentetitulo, xbrushes, 624, 220);
                    e.Graphics.DrawLine(pen, 655, 210, 655, 210 + numLargoTitulo);
                    e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 660, 214);
                    e.Graphics.DrawString("Unit Price", fuentetitulo, xbrushes, 660, 228);
                    e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo);
                    e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 725, 214);
                    e.Graphics.DrawString("Amount", fuentetitulo, xbrushes, 725, 228);
                    e.Graphics.DrawLine(pen, 655, 226, 780, 226);
                    #endregion

                    #region Detalle factura
                    numGuardaFila = numFila + 15;
                    numFila = numFila + 25;
                    numCuentaLinea = 1;//FJRF - Se cambia el cuenta linea a uno para que entre al ciclo
                    strReferencia = "";
                    numTotalProductos = 0;
                    numPar = 1;

                    // Detalle de la factura
                    foreach (DataRow dr in dtDetFactura.Rows)
                    {
                        numColumna = 200;
                        numTamañoRef = dr["NOMREF_REF"].ToString().Trim().Length;
                        //numCuentaLinea = numCuentaLinea + 1; FJRF - Se quita de aca para poner contar correctamente

                        if (numPaginas == 1 && numCuentaLinea < 38)
                        {
                            if (strReferencia != dr["REFERENCIA"].ToString())
                            {
                                if (numTotalProductos > 0)
                                {
                                    e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                    e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                                }
                                strReferencia = dr["REFERENCIA"].ToString();
                                e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                                e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                                e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                                e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                                numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);
                                
                                numFila = numFila + 15;
                                numPar = numPar + 1;
                                if (numPar % 2 == 0)
                                    e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                                numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);

                                numCuentaLinea = numCuentaLinea + 1;//FJRF - Ponemos el contador aca porque el esta agrupando los datos para la impresion por eso debe contar caba vez que cambia de grupo y no todos los datos
                            }
                            else
                            {
                                numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                            }
                            numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                        }

                        if (numPaginas > 1 && numCuentaLinea < 51)
                        {
                            if (strReferencia != dr["REFERENCIA"].ToString())
                            {
                                if (numTotalProductos > 0)
                                {
                                    e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                    e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                                }
                                strReferencia = dr["REFERENCIA"].ToString();
                                e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                                e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                                e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                                e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                                numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                                numFila = numFila + 15;
                                numPar = numPar + 1;
                                if (numPar % 2 == 0)
                                    e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                                numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                            }
                            else
                            {
                                numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                            }
                            numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                        }
                    }
                    e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                    e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);

                    // Lineas verticales den el detalle de la factura
                    e.Graphics.DrawLine(pen, 55, numGuardaFila, 55, numFila);
                    e.Graphics.DrawLine(pen, 150, numGuardaFila, 150, numFila);
                    e.Graphics.DrawLine(pen, 200, numGuardaFila, 200, numFila);
                    e.Graphics.DrawLine(pen, 220, numGuardaFila, 220, numFila);

                    e.Graphics.DrawLine(pen, 620, numGuardaFila, 620, numFila);
                    e.Graphics.DrawLine(pen, 655, numGuardaFila, 655, numFila);
                    e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila);
                    #endregion

                    IntTotalArticulos = numArticulos;//FJRF - Para una segunda hoja

                    #region Pie de factura
                    if (numPaginas == 1)
                    {
                        // Cuadro inferior de totales
                        e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 750, 125)); //15, 850, 760, 125
                        e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                        e.Graphics.DrawLine(pen, 580, 875, 765, 875); // 580, 875, 775, 875
                        e.Graphics.DrawLine(pen, 580, 900, 765, 900); // 580, 900, 775, 900
                        e.Graphics.DrawLine(pen, 580, 925, 765, 925); // 580, 925, 775, 925
                        e.Graphics.DrawLine(pen, 580, 950, 765, 950); // 580, 950, 775, 950

                        e.Graphics.DrawLine(pen, 670, 850, 670, 975); // 670, 850, 670, 975

                        e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                        e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 880);
                        e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 905);
                        e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 930);
                        e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 955);

                        e.Graphics.DrawLine(pen, 15, 900, 580, 900);

                        e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                        e.Graphics.DrawLine(pen, 156, 850, 156, 900);
                        e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                        e.Graphics.DrawLine(pen, 297, 850, 297, 900);
                        e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                        e.Graphics.DrawLine(pen, 438, 850, 438, 900);
                        e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                        e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                        e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                        e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                        // Pie de factura
                        e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION", fuentedetalle, xbrushes, 14, 977);
                        e.Graphics.DrawString("LEGAL POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                        e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                        e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                        e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                        e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                        e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                        e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                        //Valores de la tabla encabezado factura
                        foreach (DataRow dr in dtEncFactura.Rows)
                        {
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 880, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 905, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 930, 100, 15), formato1);
                            e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 955, 100, 15), formato1);

                            #region FJRF - Traemos la cantidad de articulos
                            StrDatoRetornado = MdoGeneral.StrRetornarUnSoloCampo("SUM(CANREF_DFA)", "CANTIDAD", "DETFACP", "NROFAC_DFA = '" + dtEncFactura.Rows[0]["NROFAC_EFA"].ToString() + "'");//FJRF - Hacemos un sum a la cantidad de articulos
                            if (StrDatoRetornado == null) { StrDatoRetornado = "0"; }//FJRF - Validamos que no venga nulo 
                            if (StrDatoRetornado.Trim() == "") { StrDatoRetornado = "0"; }//FJRF - Validamos que no venga vacio
                            #endregion

                            e.Graphics.DrawString(String.Format("{0,8:0,#}", StrDatoRetornado), fuentetitulo, xbrushes, 350, 875);
                            //e.Graphics.DrawString(String.Format("{0,8:0,#}", numArticulos), fuentetitulo, xbrushes, 350, 875);//FJRF - Quitamos esta linea porque el conteo esta malo ejemplo factura [0047909] muestra 51 y es de 66

                            if (dr["STRVALOR"].ToString().Trim().Length > 130)
                            {
                                e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                                e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                            }
                            else
                                e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                            RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                            StringFormat formato = new StringFormat();
                            formato.FormatFlags = StringFormatFlags.DirectionVertical;
                            e.Graphics.TranslateTransform(775, 977); //790, 977
                            e.Graphics.RotateTransform(180);
                            e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                            e.Graphics.RotateTransform(-180);
                        }
                    }
                    #endregion
                }

                imprimirPDF();
            }

            private void imprimirPagina2(PrintPageEventArgs e)
            {
                #region variables
                var dtEmpresa = _dts.Tables[0];
                var dtCliente = _dts.Tables[1];
                var dtOrdenes = _dts.Tables[2];
                var dtPedidos = _dts.Tables[3];
                var dtEncFactura = _dts.Tables[5];//FJRF - Se cambia tenia el 4
                var dtTallas = _dts.Tables[6];//FJRF - Se cambia tenia el 5
                var dtDetFactura = _dts.Tables[7];//FJRF - Se cambia tenia el 7

                int fontsize = 6;
                var xbrushes = Brushes.Black;
                var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                var fuentenormal = new Font("Tahoma", fontsize);
                var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                var fuentelistadetalle = new Font("Arial", 5);
                var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                int numCantidadTallas = 0;
                int numLargoTitulo = 0;
                int numGuardaFila = 0;
                int numRepite = 0;
                int numPar = 0;
                Int32 numArticulos = 0;//FJRF - ojo
                int numContadorCol = 0;
                int numCuantos = 0;
                int numTamañoRef = 0;
                bool logTallasOK = false;

                StringFormat formato1 = new StringFormat();
                formato1.Alignment = StringAlignment.Far;
                formato1.LineAlignment = StringAlignment.Far;
                #endregion

                #region encabezado
                // Imprime el logo
                Image logo = Properties.Resources.artesalogo;
                e.Graphics.DrawImage(logo, 8, 10);

                // Titulo factura con numero
                e.Graphics.FillRectangle(Brushes.LightGray, 560, 20, 220, 40);
                e.Graphics.DrawString("FACTURA DE VENTA", fuentegrande, xbrushes, 600, 23);
                e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 645, 40);
                
                // Control de paginacion
                e.Graphics.DrawString("Página:   2  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 705, 65);

                // Cuadro superior derecho
                e.Graphics.DrawRectangle(pen, new Rectangle(560, 85, 220, 33));
                e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                e.Graphics.DrawLine(pen, 560, 96, 780, 96);
                e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                e.Graphics.DrawLine(pen, 560, 107, 780, 107);
                e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                #endregion

                e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                // Informacion empresa en la parte superior izquierda
                e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                // Cuado izquierdo vendido a
                e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 173);
                //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                e.Graphics.DrawString("VIA:", fuentetitulo, xbrushes, 90, 183);

                // Cuadro derecho pedidos y ordenes
                e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 385, 60));
                e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                e.Graphics.DrawLine(pen, 395, 160, 780, 160);
                if (strOrdenes.Length < 66)
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                }
                else
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                    //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                    e.Graphics.DrawString(strOrdenes.Substring(72), fuentetitulo, xbrushes, 400, 185);
                }
                #endregion

                #region Titulos del Detalle factura
                //Encabezado de items de la factura
                numLargoTitulo = (numCantidadTallas * 10) + 20;
                e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 765, numLargoTitulo);
                e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 220);
                e.Graphics.DrawLine(pen, 55, 210, 55, 210 + numLargoTitulo);
                e.Graphics.DrawString("Referencia", fuentetitulo, xbrushes, 75, 220);
                e.Graphics.DrawLine(pen, 150, 210, 150, 210 + numLargoTitulo);
                e.Graphics.DrawString("Color", fuentetitulo, xbrushes, 155, 220);
                e.Graphics.DrawLine(pen, 200, 210, 200, 210 + numLargoTitulo);

                // Imprime dinamicamente los diferentes tipos de tallas
                numFila = 200;
                foreach (DataRow dr in dtTallas.Rows)
                {
                    if (dr["POSTAL_TAL"].ToString() == "1")
                    {
                        if (numRepite > 1)
                        {
                            if (numContadorCol == 20)
                                logTallasOK = true;
                            if (numContadorCol > numCuantos)
                                numCuantos = numContadorCol;
                            numContadorCol = 0;
                            e.Graphics.DrawLine(pen, numColumna, 226 + (20 * (numRepite - 1)), 620, 226 + (20 * (numRepite - 1)));
                        }
                        numRepite++;
                        numColumna = 200;
                        numFila = numFila + 15;
                        e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentetitulo, xbrushes, numColumna + 3, numFila);
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                    e.Graphics.DrawString(dr["CODTAL_TAL"].ToString().PadLeft(3, ' '), fuentetitulo, xbrushes, numColumna + 1, numFila);
                    numColumna = numColumna + 20;
                    if (numRepite == 1)
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    numContadorCol++;
                }

                if (numContadorCol == 20)
                    logTallasOK = true;

                if (numContadorCol > numCuantos && logTallasOK == false)
                    numCuantos = numContadorCol;

                if (numRepite == 1)
                    e.Graphics.DrawLine(pen, 200, 226, 620, 226);

                if (logTallasOK == false)
                {
                    for (int i = numCuantos; i < 20; i++)
                    {
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                }

                // Parte final del encabezado de items de la factura
                e.Graphics.DrawString("Total", fuentetitulo, xbrushes, 624, 220);
                e.Graphics.DrawLine(pen, 655, 210, 655, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 660, 214);
                e.Graphics.DrawString("Unit Price", fuentetitulo, xbrushes, 660, 228);
                e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 725, 214);
                e.Graphics.DrawString("Amount", fuentetitulo, xbrushes, 725, 228);
                e.Graphics.DrawLine(pen, 655, 226, 780, 226);
                #endregion

                #region Detalle factura
                numGuardaFila = numFila + 15;
                numFila = numFila + 25;
                numCuentaLinea = 0;
                strReferencia = "";
                numPar = 1;

                // Detalle de la factura
                foreach (DataRow dr in dtDetFactura.Rows)
                {
                    numColumna = 200;
                    numTamañoRef = dr["NOMREF_REF"].ToString().Trim().Length;
                    numCuentaLinea = numCuentaLinea + 1;

                    if (numPaginas == 2 && numCuentaLinea > 50 && numCuentaLinea < 89)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }

                    if (numPaginas > 2 && numCuentaLinea > 50 && numCuentaLinea < 101)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }
                }
                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);

                // Lineas verticales den el detalle de la factura
                e.Graphics.DrawLine(pen, 55, numGuardaFila, 55, numFila);
                e.Graphics.DrawLine(pen, 150, numGuardaFila, 150, numFila);
                e.Graphics.DrawLine(pen, 200, numGuardaFila, 200, numFila);
                e.Graphics.DrawLine(pen, 220, numGuardaFila, 220, numFila);

                e.Graphics.DrawLine(pen, 620, numGuardaFila, 620, numFila);
                e.Graphics.DrawLine(pen, 655, numGuardaFila, 655, numFila);
                e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila);
                #endregion

                #region Pie de factura
                if (numPaginas == 2)
                {
                    // Cuadro inferior de totales
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 750, 125)); //15, 850, 760, 125
                    e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                    e.Graphics.DrawLine(pen, 580, 875, 765, 875); //580, 875, 775, 875
                    e.Graphics.DrawLine(pen, 580, 900, 765, 900); //580, 900, 775, 900
                    e.Graphics.DrawLine(pen, 580, 925, 765, 925); //580, 925, 775, 925
                    e.Graphics.DrawLine(pen, 580, 950, 765, 950); //580, 950, 775, 950

                    e.Graphics.DrawLine(pen, 670, 850, 660, 975); //670, 850, 670, 975

                    e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                    e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 880);
                    e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 905);
                    e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 930);
                    e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 955);

                    e.Graphics.DrawLine(pen, 15, 900, 580, 900);

                    e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                    e.Graphics.DrawLine(pen, 156, 850, 156, 900);
                    e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                    e.Graphics.DrawLine(pen, 297, 850, 297, 900);
                    e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                    e.Graphics.DrawLine(pen, 438, 850, 438, 900);
                    e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                    e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                    e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                    e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                    // Pie de factura
                    e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION LEGAL", fuentedetalle, xbrushes, 14, 977);
                    e.Graphics.DrawString("POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                    e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                    e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                    e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                    e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                    e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                    e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                    //Valores de la tabla encabezado factura
                    foreach (DataRow dr in dtEncFactura.Rows)
                    {
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 880, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 905, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 930, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 955, 100, 15), formato1);
                        
                        //e.Graphics.DrawString(String.Format("{0,8:0,#}", numArticulos), fuentetitulo, xbrushes, 350, 875);//FJRF - No trae nada
                        e.Graphics.DrawString(String.Format("{0,8:0,#}", IntTotalArticulos), fuentetitulo, xbrushes, 350, 875);//FJRF - pone el numero total de articulos
                        
                        if (dr["STRVALOR"].ToString().Trim().Length > 130)
                        {
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                            e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                        }
                        else
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                        RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                        StringFormat formato = new StringFormat();
                        formato.FormatFlags = StringFormatFlags.DirectionVertical;
                        e.Graphics.TranslateTransform(775, 977);  //790, 977
                        e.Graphics.RotateTransform(180);
                        e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                        e.Graphics.RotateTransform(-180);
                    }
                }
                #endregion
            }

            private void imprimirPagina3(PrintPageEventArgs e)
            {
                #region variables
                var dtEmpresa = _dts.Tables[0];
                var dtCliente = _dts.Tables[1];
                var dtOrdenes = _dts.Tables[2];
                var dtPedidos = _dts.Tables[3];
                var dtEncFactura = _dts.Tables[4];
                var dtTallas = _dts.Tables[5];
                var dtDetFactura = _dts.Tables[6];

                int fontsize = 6;
                var xbrushes = Brushes.Black;
                var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                var fuentenormal = new Font("Tahoma", fontsize);
                var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                var fuentelistadetalle = new Font("Arial", 5);
                var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                int numCantidadTallas = 0;
                int numLargoTitulo = 0;
                int numGuardaFila = 0;
                int numRepite = 0;
                int numPar = 0;
                Int32 numArticulos = 0;
                int numContadorCol = 0;
                int numCuantos = 0;
                int numTamañoRef = 0;
                bool logTallasOK = false;

                StringFormat formato1 = new StringFormat();
                formato1.Alignment = StringAlignment.Far;
                formato1.LineAlignment = StringAlignment.Far;
                #endregion

                #region encabezado
                // Imprime el logo
                Image logo = Properties.Resources.artesalogo;
                e.Graphics.DrawImage(logo, 8, 10);

                // Titulo factura con numero
                e.Graphics.FillRectangle(Brushes.LightGray, 560, 20, 220, 40);
                e.Graphics.DrawString("FACTURA DE VENTA", fuentegrande, xbrushes, 600, 23);
                e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 645, 40);

                // Control de paginacion
                e.Graphics.DrawString("Página:   3  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 705, 65);

                // Cuadro superior derecho
                e.Graphics.DrawRectangle(pen, new Rectangle(560, 85, 220, 33));
                e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                e.Graphics.DrawLine(pen, 560, 96, 780, 96);
                e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                e.Graphics.DrawLine(pen, 560, 107, 780, 107);
                e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                #endregion

                e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                // Informacion empresa en la parte superior izquierda
                e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                // Cuado izquierdo vendido a
                e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 173);
                //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                e.Graphics.DrawString("VIA:", fuentetitulo, xbrushes, 90, 183);

                // Cuadro derecho pedidos y ordenes
                e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 385, 60));
                e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                e.Graphics.DrawLine(pen, 395, 160, 780, 160);
                if (strOrdenes.Length < 66)
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                }
                else
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                    //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                    e.Graphics.DrawString(strOrdenes.Substring(72), fuentetitulo, xbrushes, 400, 185);
                }
                #endregion

                #region Titulos del Detalle factura
                //Encabezado de items de la factura
                numLargoTitulo = (numCantidadTallas * 10) + 20;
                e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 765, numLargoTitulo);
                e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 220);
                e.Graphics.DrawLine(pen, 55, 210, 55, 210 + numLargoTitulo);
                e.Graphics.DrawString("Referencia", fuentetitulo, xbrushes, 75, 220);
                e.Graphics.DrawLine(pen, 150, 210, 150, 210 + numLargoTitulo);
                e.Graphics.DrawString("Color", fuentetitulo, xbrushes, 155, 220);
                e.Graphics.DrawLine(pen, 200, 210, 200, 210 + numLargoTitulo);

                // Imprime dinamicamente los diferentes tipos de tallas
                numFila = 200;
                foreach (DataRow dr in dtTallas.Rows)
                {
                    if (dr["POSTAL_TAL"].ToString() == "1")
                    {
                        if (numRepite > 1)
                        {
                            if (numContadorCol == 20)
                                logTallasOK = true;
                            if (numContadorCol > numCuantos)
                                numCuantos = numContadorCol;
                            numContadorCol = 0;
                            e.Graphics.DrawLine(pen, numColumna, 226 + (20 * (numRepite - 1)), 620, 226 + (20 * (numRepite - 1)));
                        }
                        numRepite++;
                        numColumna = 200;
                        numFila = numFila + 15;
                        e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentetitulo, xbrushes, numColumna + 3, numFila);
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                    e.Graphics.DrawString(dr["CODTAL_TAL"].ToString().PadLeft(3, ' '), fuentetitulo, xbrushes, numColumna + 1, numFila);
                    numColumna = numColumna + 20;
                    if (numRepite == 1)
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    numContadorCol++;
                }

                if (numContadorCol == 20)
                    logTallasOK = true;

                if (numContadorCol > numCuantos && logTallasOK == false)
                    numCuantos = numContadorCol;

                if (numRepite == 1)
                    e.Graphics.DrawLine(pen, 200, 226, 620, 226);

                if (logTallasOK == false)
                {
                    for (int i = numCuantos; i < 20; i++)
                    {
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                }

                // Parte final del encabezado de items de la factura
                e.Graphics.DrawString("Total", fuentetitulo, xbrushes, 624, 220);
                e.Graphics.DrawLine(pen, 655, 210, 655, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 660, 214);
                e.Graphics.DrawString("Unit Price", fuentetitulo, xbrushes, 660, 228);
                e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 725, 214);
                e.Graphics.DrawString("Amout", fuentetitulo, xbrushes, 725, 228);
                e.Graphics.DrawLine(pen, 655, 226, 780, 226);
                #endregion

                #region Detalle factura
                numGuardaFila = numFila + 15;
                numFila = numFila + 25;
                numCuentaLinea = 0;
                strReferencia = "";
                numPar = 1;

                // Detalle de la factura
                foreach (DataRow dr in dtDetFactura.Rows)
                {
                    numColumna = 200;
                    numTamañoRef = dr["NOMREF_REF"].ToString().Trim().Length;
                    numCuentaLinea = numCuentaLinea +1 ;

                    if (numPaginas == 3 && numCuentaLinea > 100 && numCuentaLinea < 139)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);
                            
                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }

                    if (numPaginas > 3 && numCuentaLinea > 100 && numCuentaLinea < 151)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }
                }
                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);

                // Lineas verticales den el detalle de la factura
                e.Graphics.DrawLine(pen, 55, numGuardaFila, 55, numFila);
                e.Graphics.DrawLine(pen, 150, numGuardaFila, 150, numFila);
                e.Graphics.DrawLine(pen, 200, numGuardaFila, 200, numFila);
                e.Graphics.DrawLine(pen, 220, numGuardaFila, 220, numFila);

                e.Graphics.DrawLine(pen, 620, numGuardaFila, 620, numFila);
                e.Graphics.DrawLine(pen, 655, numGuardaFila, 655, numFila);
                e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila);
                #endregion

                #region Pie de factura
                if (numPaginas == 3)
                {
                    // Cuadro inferior de totales
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 760, 125));
                    e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                    e.Graphics.DrawLine(pen, 580, 875, 775, 875);
                    e.Graphics.DrawLine(pen, 580, 900, 775, 900);
                    e.Graphics.DrawLine(pen, 580, 925, 775, 925);
                    e.Graphics.DrawLine(pen, 580, 950, 775, 950);

                    e.Graphics.DrawLine(pen, 670, 850, 670, 975);

                    e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                    e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 880);
                    e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 905);
                    e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 930);
                    e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 955);

                    e.Graphics.DrawLine(pen, 15, 900, 580, 900);

                    e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                    e.Graphics.DrawLine(pen, 156, 850, 156, 900);
                    e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                    e.Graphics.DrawLine(pen, 297, 850, 297, 900);
                    e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                    e.Graphics.DrawLine(pen, 438, 850, 438, 900);
                    e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                    e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                    e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                    e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                    // Pie de factura
                    e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION LEGAL", fuentedetalle, xbrushes, 14, 977);
                    e.Graphics.DrawString("POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                    e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                    e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                    e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                    e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                    e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                    e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                    //Valores de la tabla encabezado factura
                    foreach (DataRow dr in dtEncFactura.Rows)
                    {
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 880, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 905, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 930, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 955, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,8:0,#}", numArticulos), fuentetitulo, xbrushes, 350, 875);
                        if (dr["STRVALOR"].ToString().Trim().Length > 130)
                        {
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                            e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                        }
                        else
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                        RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                        StringFormat formato = new StringFormat();
                        formato.FormatFlags = StringFormatFlags.DirectionVertical;
                        e.Graphics.TranslateTransform(790, 977);
                        e.Graphics.RotateTransform(180);
                        e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                        e.Graphics.RotateTransform(-180);
                    }
                }
                #endregion
            }

            private void imprimirPagina4(PrintPageEventArgs e)
            {
                #region variables
                var dtEmpresa = _dts.Tables[0];
                var dtCliente = _dts.Tables[1];
                var dtOrdenes = _dts.Tables[2];
                var dtPedidos = _dts.Tables[3];
                var dtEncFactura = _dts.Tables[4];
                var dtTallas = _dts.Tables[5];
                var dtDetFactura = _dts.Tables[6];

                int fontsize = 6;
                var xbrushes = Brushes.Black;
                var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                var fuentenormal = new Font("Tahoma", fontsize);
                var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                var fuentelistadetalle = new Font("Arial", 5);
                var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                int numCantidadTallas = 0;
                int numLargoTitulo = 0;
                int numGuardaFila = 0;
                int numRepite = 0;
                int numPar = 0;
                Int32 numArticulos = 0;
                int numContadorCol = 0;
                int numCuantos = 0;
                int numTamañoRef = 0;
                bool logTallasOK = false;

                StringFormat formato1 = new StringFormat();
                formato1.Alignment = StringAlignment.Far;
                formato1.LineAlignment = StringAlignment.Far;
                #endregion

                #region encabezado
                // Imprime el logo
                Image logo = Properties.Resources.artesalogo;
                e.Graphics.DrawImage(logo, 8, 10);

                // Titulo factura con numero
                e.Graphics.FillRectangle(Brushes.LightGray, 560, 20, 220, 40);
                e.Graphics.DrawString("FACTURA DE VENTA", fuentegrande, xbrushes, 600, 23);
                e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 645, 40);

                // Control de paginacion
                e.Graphics.DrawString("Página:   4  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 705, 65);

                // Cuadro superior derecho
                e.Graphics.DrawRectangle(pen, new Rectangle(560, 85, 220, 33));
                e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                e.Graphics.DrawLine(pen, 560, 96, 780, 96);
                e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                e.Graphics.DrawLine(pen, 560, 107, 780, 107);
                e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                #endregion

                e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                // Informacion empresa en la parte superior izquierda
                e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                // Cuado izquierdo vendido a
                e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 173);
                //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                e.Graphics.DrawString("VIA:", fuentetitulo, xbrushes, 90, 183);

                // Cuadro derecho pedidos y ordenes
                e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 385, 60));
                e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                e.Graphics.DrawLine(pen, 395, 160, 780, 160);
                if (strOrdenes.Length < 66)
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                }
                else
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                    //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                    e.Graphics.DrawString(strOrdenes.Substring(72), fuentetitulo, xbrushes, 400, 185);
                }
                #endregion

                #region Titulos del Detalle factura
                //Encabezado de items de la factura
                numLargoTitulo = (numCantidadTallas * 10) + 20;
                e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 765, numLargoTitulo);
                e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 220);
                e.Graphics.DrawLine(pen, 55, 210, 55, 210 + numLargoTitulo);
                e.Graphics.DrawString("Referencia", fuentetitulo, xbrushes, 75, 220);
                e.Graphics.DrawLine(pen, 150, 210, 150, 210 + numLargoTitulo);
                e.Graphics.DrawString("Color", fuentetitulo, xbrushes, 155, 220);
                e.Graphics.DrawLine(pen, 200, 210, 200, 210 + numLargoTitulo);

                // Imprime dinamicamente los diferentes tipos de tallas
                numFila = 200;
                foreach (DataRow dr in dtTallas.Rows)
                {
                    if (dr["POSTAL_TAL"].ToString() == "1")
                    {
                        if (numRepite > 1)
                        {
                            if (numContadorCol == 20)
                                logTallasOK = true;
                            if (numContadorCol > numCuantos)
                                numCuantos = numContadorCol;
                            numContadorCol = 0;
                            e.Graphics.DrawLine(pen, numColumna, 226 + (20 * (numRepite - 1)), 620, 226 + (20 * (numRepite - 1)));
                        }
                        numRepite++;
                        numColumna = 200;
                        numFila = numFila + 15;
                        e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentetitulo, xbrushes, numColumna + 3, numFila);
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                    e.Graphics.DrawString(dr["CODTAL_TAL"].ToString().PadLeft(3, ' '), fuentetitulo, xbrushes, numColumna + 1, numFila);
                    numColumna = numColumna + 20;
                    if (numRepite == 1)
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    numContadorCol++;
                }

                if (numContadorCol == 20)
                    logTallasOK = true;

                if (numContadorCol > numCuantos && logTallasOK == false)
                    numCuantos = numContadorCol;

                if (numRepite == 1)
                    e.Graphics.DrawLine(pen, 200, 226, 620, 226);

                if (logTallasOK == false)
                {
                    for (int i = numCuantos; i < 20; i++)
                    {
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                }

                // Parte final del encabezado de items de la factura
                e.Graphics.DrawString("Total", fuentetitulo, xbrushes, 624, 220);
                e.Graphics.DrawLine(pen, 655, 210, 655, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 660, 214);
                e.Graphics.DrawString("Unit Price", fuentetitulo, xbrushes, 660, 228);
                e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 725, 214);
                e.Graphics.DrawString("Amout", fuentetitulo, xbrushes, 725, 228);
                e.Graphics.DrawLine(pen, 655, 226, 780, 226);
                #endregion

                #region Detalle factura
                numGuardaFila = numFila + 15;
                numFila = numFila + 25;
                numCuentaLinea = 0;
                strReferencia = "";
               numPar = 1;

                // Detalle de la factura
                foreach (DataRow dr in dtDetFactura.Rows)
                {
                    numColumna = 200;
                    numTamañoRef = dr["NOMREF_REF"].ToString().Trim().Length;
                    numCuentaLinea = numCuentaLinea+1;

                    if (numPaginas == 4 && numCuentaLinea > 150 && numCuentaLinea < 189)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);
                            
                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }

                    if (numPaginas > 4 && numCuentaLinea > 150 && numCuentaLinea < 201)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }
                }
                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);

                // Lineas verticales den el detalle de la factura
                e.Graphics.DrawLine(pen, 55, numGuardaFila, 55, numFila);
                e.Graphics.DrawLine(pen, 150, numGuardaFila, 150, numFila);
                e.Graphics.DrawLine(pen, 200, numGuardaFila, 200, numFila);
                e.Graphics.DrawLine(pen, 220, numGuardaFila, 220, numFila);

                e.Graphics.DrawLine(pen, 620, numGuardaFila, 620, numFila);
                e.Graphics.DrawLine(pen, 655, numGuardaFila, 655, numFila);
                e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila);
                #endregion

                #region Pie de factura
                if (numPaginas == 4)
                {
                    // Cuadro inferior de totales
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 760, 125));
                    e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                    e.Graphics.DrawLine(pen, 580, 875, 775, 875);
                    e.Graphics.DrawLine(pen, 580, 900, 775, 900);
                    e.Graphics.DrawLine(pen, 580, 925, 775, 925);
                    e.Graphics.DrawLine(pen, 580, 950, 775, 950);

                    e.Graphics.DrawLine(pen, 670, 850, 670, 975);

                    e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                    e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 880);
                    e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 905);
                    e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 930);
                    e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 955);

                    e.Graphics.DrawLine(pen, 15, 900, 580, 900);

                    e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                    e.Graphics.DrawLine(pen, 156, 850, 156, 900);
                    e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                    e.Graphics.DrawLine(pen, 297, 850, 297, 900);
                    e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                    e.Graphics.DrawLine(pen, 438, 850, 438, 900);
                    e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                    e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                    e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                    e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                    // Pie de factura
                    e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION LEGAL", fuentedetalle, xbrushes, 14, 977);
                    e.Graphics.DrawString("POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                    e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                    e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                    e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                    e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                    e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                    e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                    //Valores de la tabla encabezado factura
                    foreach (DataRow dr in dtEncFactura.Rows)
                    {
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 880, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 905, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 930, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 955, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,8:0,#}", numArticulos), fuentetitulo, xbrushes, 350, 875);
                        if (dr["STRVALOR"].ToString().Trim().Length > 130)
                        {
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                            e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                        }
                        else
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                        RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                        StringFormat formato = new StringFormat();
                        formato.FormatFlags = StringFormatFlags.DirectionVertical;
                        e.Graphics.TranslateTransform(790, 977);
                        e.Graphics.RotateTransform(180);
                        e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                        e.Graphics.RotateTransform(-180);
                    }
                }
                #endregion
            }

            private void imprimirPagina5(PrintPageEventArgs e)
            {
                #region variables
                var dtEmpresa = _dts.Tables[0];
                var dtCliente = _dts.Tables[1];
                var dtOrdenes = _dts.Tables[2];
                var dtPedidos = _dts.Tables[3];
                var dtEncFactura = _dts.Tables[4];
                var dtTallas = _dts.Tables[5];
                var dtDetFactura = _dts.Tables[6];

                int fontsize = 6;
                var xbrushes = Brushes.Black;
                var fuentetitulo = new Font("Tahoma", 6, FontStyle.Bold);
                var fuentenormal = new Font("Tahoma", fontsize);
                var fuentepequeña = new Font("Tahoma", 5, FontStyle.Bold);
                var fuentedetalle = new Font("Tahoma", 6, FontStyle.Regular);
                var fuentegrande = new Font("Tahoma", 10, FontStyle.Bold);
                var fuentelistadetalle = new Font("Arial", 5);
                var pen = new Pen(Color.Black) { DashStyle = DashStyle.Solid };
                var pen2 = new Pen(Color.Gray) { DashStyle = DashStyle.Dot };

                int numCantidadTallas = 0;
                int numLargoTitulo = 0;
                int numGuardaFila = 0;
                int numRepite = 0;
                int numPar = 0;
                Int32 numArticulos = 0;
                int numContadorCol = 0;
                int numCuantos = 0;
                int numTamañoRef = 0;
                bool logTallasOK = false;

                StringFormat formato1 = new StringFormat();
                formato1.Alignment = StringAlignment.Far;
                formato1.LineAlignment = StringAlignment.Far;
                #endregion

                #region encabezado
                // Imprime el logo
                Image logo = Properties.Resources.artesalogo;
                e.Graphics.DrawImage(logo, 8, 10);

                // Titulo factura con numero
                e.Graphics.FillRectangle(Brushes.LightGray, 560, 20, 220, 40);
                e.Graphics.DrawString("FACTURA DE VENTA", fuentegrande, xbrushes, 600, 23);
                e.Graphics.DrawString(dtEncFactura.Rows[0]["NROFAC_EFA"].ToString(), fuentegrande, xbrushes, 645, 40);

                // Control de paginacion
                e.Graphics.DrawString("Página:   5  de  " + Convert.ToString(numPaginas).Trim(), fuentetitulo, xbrushes, 705, 65);

                // Cuadro superior derecho
                e.Graphics.DrawRectangle(pen, new Rectangle(560, 85, 220, 33));
                e.Graphics.DrawString("FECHA: ", fuentetitulo, xbrushes, 570, 85);
                e.Graphics.DrawLine(pen, 560, 96, 780, 96);
                e.Graphics.DrawString("PLAZO: ", fuentetitulo, xbrushes, 570, 96);
                e.Graphics.DrawLine(pen, 560, 107, 780, 107);
                e.Graphics.DrawString("VENCE: ", fuentetitulo, xbrushes, 570, 107);

                #region FJRF - Calculamos el plazo en dias atravez de las fechas de la factura
                DateTime DttFechaFactura, DttFechaVencimientoFactura;//FJRF - Creamos un manejador de fechas
                DttFechaFactura = DateTime.Parse(dtEncFactura.Rows[0]["FECFAC_EFA"].ToString());//FJRF - Extraemos la fecha
                DttFechaVencimientoFactura = DateTime.Parse(dtEncFactura.Rows[0]["VTOFAC_EFA"].ToString());//FJRF - Extraemos la fecha

                TimeSpan TsDiferenciaEnDiasHorasYMinutos = DttFechaVencimientoFactura - DttFechaFactura;//FJRF - Restamos las fechas
                int IntDiasDePlazoFactura = TsDiferenciaEnDiasHorasYMinutos.Days;//FJRF - Extraemos solo la diferencia en dias para saber el plazo de la factura
                #endregion

                e.Graphics.DrawLine(pen, 640, 85, 640, 118);
                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["FECFAC_EFA"]), fuentetitulo, xbrushes, 650, 85);

                //e.Graphics.DrawString(dtCliente.Rows[0]["PLAZO_CLI"].ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);
                e.Graphics.DrawString(IntDiasDePlazoFactura.ToString() + " DIAS NETO ", fuentetitulo, xbrushes, 650, 96);//FJRF - Remplazamos la linea de arriba por un valor calculado de la fecha de la factura

                e.Graphics.DrawString(String.Format("{0:dd/MM/yyyy}", dtEncFactura.Rows[0]["VTOFAC_EFA"]), fuentetitulo, xbrushes, 650, 107);

                // Informacion empresa en la parte superior izquierda
                e.Graphics.DrawString("NIT: " + dtEmpresa.Rows[0]["NIT_CFG"].ToString(), fuentetitulo, xbrushes, 15, 65);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["REGIMEN_CFG"].ToString().Trim() + ".  -  No somos Grandes Contribuyentes Res No 000041 de Enero 30/2014", fuentetitulo, xbrushes, 15, 75);
                e.Graphics.DrawString("No somos Autoretenedores. Código Actividad RUT 1521.", fuentetitulo, xbrushes, 15, 85);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["DIRCOM_CFG"].ToString().Trim(), fuentetitulo, xbrushes, 15, 95);
                e.Graphics.DrawString("TEL: " + dtEmpresa.Rows[0]["TELCOM_CFG"].ToString().Trim() + "   FAX: " + dtEmpresa.Rows[0]["FAXCOM_CFG"].ToString().Trim() + "   CEL: 3113218615", fuentetitulo, xbrushes, 15, 105);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["APARTADO_CFG"].ToString().Trim() + ".    Correo: bmartham@mybosi.com", fuentetitulo, xbrushes, 15, 115);
                e.Graphics.DrawString(dtEmpresa.Rows[0]["CIUDAD_CFG"].ToString(), fuentetitulo, xbrushes, 15, 125);

                // Cuado izquierdo vendido a
                e.Graphics.DrawRectangle(pen, new Rectangle(15, 140, 375, 60));
                e.Graphics.DrawString("VENDIDO A:", fuentetitulo, xbrushes, 20, 143);
                e.Graphics.DrawString(dtCliente.Rows[0]["NOMCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 143);
                e.Graphics.DrawString("Attn: " + dtCliente.Rows[0]["CONTAC_CLI"].ToString(), fuentetitulo, xbrushes, 90, 153);
                e.Graphics.DrawString(dtCliente.Rows[0]["DIRCLI_CLI"].ToString() + " " + dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 163);
                e.Graphics.DrawString("NIT: " + dtCliente.Rows[0]["NITCLI_CLI"].ToString(), fuentetitulo, xbrushes, 90, 173);
                //e.Graphics.DrawString(dtCliente.Rows[0]["NOMCIU_CIU"].ToString(), fuentetitulo, xbrushes, 90, 183);
                e.Graphics.DrawString("VIA:", fuentetitulo, xbrushes, 90, 183);

                // Cuadro derecho pedidos y ordenes
                e.Graphics.DrawRectangle(pen, new Rectangle(395, 140, 385, 60));
                e.Graphics.DrawString("PEDIDOS: " + strPedidos, fuentetitulo, xbrushes, 400, 145);
                e.Graphics.DrawLine(pen, 395, 160, 780, 160);
                if (strOrdenes.Length < 66)
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes, fuentetitulo, xbrushes, 400, 165);
                }
                else
                {
                    e.Graphics.DrawString("ORDENES: " + strOrdenes.Substring(0, 66), fuentetitulo, xbrushes, 400, 165);
                    //e.Graphics.DrawLine(pen, 420, 180, 820, 180);
                    e.Graphics.DrawString(strOrdenes.Substring(72), fuentetitulo, xbrushes, 400, 185);
                }
                #endregion

                #region Titulos del Detalle factura
                //Encabezado de items de la factura
                numLargoTitulo = (numCantidadTallas * 10) + 20;
                e.Graphics.FillRectangle(Brushes.LightGray, 15, 210, 765, numLargoTitulo);
                e.Graphics.DrawString("Código", fuentetitulo, xbrushes, 18, 220);
                e.Graphics.DrawLine(pen, 55, 210, 55, 210 + numLargoTitulo);
                e.Graphics.DrawString("Referencia", fuentetitulo, xbrushes, 75, 220);
                e.Graphics.DrawLine(pen, 150, 210, 150, 210 + numLargoTitulo);
                e.Graphics.DrawString("Color", fuentetitulo, xbrushes, 155, 220);
                e.Graphics.DrawLine(pen, 200, 210, 200, 210 + numLargoTitulo);

                // Imprime dinamicamente los diferentes tipos de tallas
                numFila = 200;
                foreach (DataRow dr in dtTallas.Rows)
                {
                    if (dr["POSTAL_TAL"].ToString() == "1")
                    {
                        if (numRepite > 1)
                        {
                            if (numContadorCol == 20)
                                logTallasOK = true;
                            if (numContadorCol > numCuantos)
                                numCuantos = numContadorCol;
                            numContadorCol = 0;
                            e.Graphics.DrawLine(pen, numColumna, 226 + (20 * (numRepite - 1)), 620, 226 + (20 * (numRepite - 1)));
                        }
                        numRepite++;
                        numColumna = 200;
                        numFila = numFila + 15;
                        e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentetitulo, xbrushes, numColumna + 3, numFila);
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                    e.Graphics.DrawString(dr["CODTAL_TAL"].ToString().PadLeft(3, ' '), fuentetitulo, xbrushes, numColumna + 1, numFila);
                    numColumna = numColumna + 20;
                    if (numRepite == 1)
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    numContadorCol++;
                }

                if (numContadorCol == 20)
                    logTallasOK = true;

                if (numContadorCol > numCuantos && logTallasOK == false)
                    numCuantos = numContadorCol;

                if (numRepite == 1)
                    e.Graphics.DrawLine(pen, 200, 226, 620, 226);

                if (logTallasOK == false)
                {
                    for (int i = numCuantos; i < 20; i++)
                    {
                        numColumna = numColumna + 20;
                        e.Graphics.DrawLine(pen, numColumna, 210, numColumna, 210 + numLargoTitulo);
                    }
                }

                // Parte final del encabezado de items de la factura
                e.Graphics.DrawString("Total", fuentetitulo, xbrushes, 624, 220);
                e.Graphics.DrawLine(pen, 655, 210, 655, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Unitario", fuentetitulo, xbrushes, 660, 214);
                e.Graphics.DrawString("Unit Price", fuentetitulo, xbrushes, 660, 228);
                e.Graphics.DrawLine(pen, 710, 210, 710, 210 + numLargoTitulo);
                e.Graphics.DrawString("P. Total", fuentetitulo, xbrushes, 725, 214);
                e.Graphics.DrawString("Amout", fuentetitulo, xbrushes, 725, 228);
                e.Graphics.DrawLine(pen, 655, 226, 780, 226);
                #endregion

                #region Detalle factura
                numGuardaFila = numFila + 15;
                numFila = numFila + 25;
                numCuentaLinea = 0;
                strReferencia = "";
                numPar = 1;

                // Detalle de la factura
                foreach (DataRow dr in dtDetFactura.Rows)
                {
                    numColumna = 200;
                    numTamañoRef = dr["NOMREF_REF"].ToString().Trim().Length;
                    numCuentaLinea = numCuentaLinea + 1;

                    if (numPaginas == 5 && numCuentaLinea > 200 && numCuentaLinea < 239)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }

                    if (numPaginas > 5 && numCuentaLinea > 200 && numCuentaLinea < 251)
                    {
                        if (strReferencia != dr["REFERENCIA"].ToString())
                        {
                            if (numTotalProductos > 0)
                            {
                                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);
                            }
                            strReferencia = dr["REFERENCIA"].ToString();
                            e.Graphics.DrawString(dr["REFERENCIA"].ToString(), fuentedetalle, xbrushes, 16, numFila + 2);
                            e.Graphics.DrawString(numTamañoRef < 19 ? dr["NOMREF_REF"].ToString() : dr["NOMREF_REF"].ToString().Trim().Substring(0, 18), fuentedetalle, xbrushes, 56, numFila + 2);
                            e.Graphics.DrawString(dr["NOMCOL_COL"].ToString(), fuentedetalle, xbrushes, 150, numFila + 2);
                            e.Graphics.DrawString(dr["CODTJE_TAL"].ToString(), fuentedetalle, xbrushes, 202, numFila + 2);
                            numPREPRO_DODAnterior = Convert.ToInt32(dr["PREPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila, 20, 13), formato1);
                            e.Graphics.DrawString(String.Format("{0,8:0,0;-0,0; 0}", dr["PREPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(640, numFila, 60, 13), formato1);

                            numFila = numFila + 15;
                            numPar++;
                            if (numPar % 2 == 0)
                                e.Graphics.FillRectangle(Brushes.LightGray, 15, numFila, 765, 15);
                            numTotalProductos = Convert.ToInt32(dr["CANPRO_DOD"]);
                        }
                        else
                        {
                            numTotalProductos = numTotalProductos + Convert.ToInt32(dr["CANPRO_DOD"]);
                            e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", dr["CANPRO_DOD"]), fuentedetalle, xbrushes, new Rectangle(195 + (Convert.ToInt16(dr["POSTAL_TAL"].ToString()) * 20), numFila - 15, 20, 13), formato1);
                        }
                        numArticulos = numArticulos + Convert.ToInt32(dr["CANPRO_DOD"]);
                        //e.Graphics.DrawLine(pen2, 15, numFila + 12, 820, numFila + 12);
                    }
                }
                e.Graphics.DrawString(String.Format("{0,3:0;-0; 0}", numTotalProductos), fuentedetalle, xbrushes, new Rectangle(610, numFila - 15, 30, 13), formato1);
                e.Graphics.DrawString(String.Format("{0,9:0,0.##;0,0.##; 0}", numPREPRO_DODAnterior * numTotalProductos), fuentedetalle, xbrushes, new Rectangle(705, numFila - 15, 60, 13), formato1);

                // Lineas verticales den el detalle de la factura
                e.Graphics.DrawLine(pen, 55, numGuardaFila, 55, numFila);
                e.Graphics.DrawLine(pen, 150, numGuardaFila, 150, numFila);
                e.Graphics.DrawLine(pen, 200, numGuardaFila, 200, numFila);
                e.Graphics.DrawLine(pen, 220, numGuardaFila, 220, numFila);

                e.Graphics.DrawLine(pen, 620, numGuardaFila, 620, numFila);
                e.Graphics.DrawLine(pen, 655, numGuardaFila, 655, numFila);
                e.Graphics.DrawLine(pen, 710, numGuardaFila, 710, numFila);
                #endregion

                #region Pie de factura
                if (numPaginas == 5)
                {
                    // Cuadro inferior de totales
                    e.Graphics.DrawRectangle(pen, new Rectangle(15, 850, 760, 125));
                    e.Graphics.DrawLine(pen, 580, 850, 580, 975);

                    e.Graphics.DrawLine(pen, 580, 875, 775, 875);
                    e.Graphics.DrawLine(pen, 580, 900, 775, 900);
                    e.Graphics.DrawLine(pen, 580, 925, 775, 925);
                    e.Graphics.DrawLine(pen, 580, 950, 775, 950);

                    e.Graphics.DrawLine(pen, 670, 850, 670, 975);

                    e.Graphics.DrawString("SUBTOTALES", fuentetitulo, xbrushes, 585, 855);
                    e.Graphics.DrawString("FLETES", fuentetitulo, xbrushes, 585, 880);
                    e.Graphics.DrawString("IVA", fuentetitulo, xbrushes, 585, 905);
                    e.Graphics.DrawString("RTE.FTE", fuentetitulo, xbrushes, 585, 930);
                    e.Graphics.DrawString("TOTAL", fuentetitulo, xbrushes, 585, 955);

                    e.Graphics.DrawLine(pen, 15, 900, 580, 900);

                    e.Graphics.DrawString("PESO BRUTO", fuentetitulo, xbrushes, 55, 855);
                    e.Graphics.DrawLine(pen, 156, 850, 156, 900);
                    e.Graphics.DrawString("PESO NETO", fuentetitulo, xbrushes, 200, 855);
                    e.Graphics.DrawLine(pen, 297, 850, 297, 900);
                    e.Graphics.DrawString("TOTAL ARTICULOS", fuentetitulo, xbrushes, 325, 855);
                    e.Graphics.DrawLine(pen, 438, 850, 438, 900);
                    e.Graphics.DrawString("TOTAL CAJAS", fuentetitulo, xbrushes, 475, 855);

                    e.Graphics.DrawString("OBSERVACIONES", fuentetitulo, xbrushes, 20, 905);
                    e.Graphics.DrawString("TODOS NUESTROS PRODUCTOS ESTAN GRABADOS CON EL 16% DE IVA.", fuentedetalle, xbrushes, 20, 949);
                    e.Graphics.DrawString("NOTA: NO HACER RETENCIÓN DE ICA. TRIBUTAMOS AL MUNICIPIO DE ITAGUI.", fuentedetalle, xbrushes, 20, 960);

                    // Pie de factura
                    e.Graphics.DrawString("SI LA PRESENTE FACTURA NO HA SIDO CANCELADA CUMPLIDA LA FECHA DE VENCIMIENTO, SE CAUSARAN INTERESES POR MORA CADA DIA DE 3.5% MENSUAL SIN PERJUICIO DE LA ACCION LEGAL", fuentedetalle, xbrushes, 14, 977);
                    e.Graphics.DrawString("POR INCUMPLIMIENTO EN EL PAGO. EL COMPRADOR Y ACEPTANTE DECLARA HABER RECIBIDO LA MERCANCIA DESCRITA EN ESTE TITULO VALOR.", fuentedetalle, xbrushes, 85, 988);
                    e.Graphics.DrawString("DECLARAMOS QUE TODOS LOS VALORES RELACIONADOS SON EXACTOS, CORRECTOS Y LA MERCANCIA ES ORIGINARIA DE COLOMBIA.", fuentedetalle, xbrushes, 105, 999);

                    e.Graphics.DrawLine(pen, 100, 1040, 400, 1040);
                    e.Graphics.DrawString("ELABORADO POR", fuentedetalle, xbrushes, 215, 1042);
                    e.Graphics.DrawLine(pen, 450, 1040, 750, 1040);
                    e.Graphics.DrawString("ACEPTADO (FIRMA Y SELLO DEL COMPRADOR)", fuentedetalle, xbrushes, 505, 1042);
                    e.Graphics.DrawString("FACTURA IMPRESA POR COMPUTADOR. SOFTWARE DESARROLLADO POR ARTESA S.A.S. NIT 800.196.632-8", fuentedetalle, xbrushes, 205, 1055);

                    //Valores de la tabla encabezado factura
                    foreach (DataRow dr in dtEncFactura.Rows)
                    {
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", (Convert.ToInt32(dr["VALFAC_EFA"]) - Convert.ToInt32(dr["IVAFAC_EFA"]) + Convert.ToInt32(dr["RTEFAC_EFA"]) - Convert.ToInt32(dr["FLETE_EFA"]))), fuentetitulo, xbrushes, new Rectangle(650, 855, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["FLETE_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 880, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["IVAFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 905, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["RTEFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 930, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,12:0,#;-0,#; 0}", dr["VALFAC_EFA"]), fuentetitulo, xbrushes, new Rectangle(650, 955, 100, 15), formato1);
                        e.Graphics.DrawString(String.Format("{0,8:0,#}", numArticulos), fuentetitulo, xbrushes, 350, 875);
                        if (dr["STRVALOR"].ToString().Trim().Length > 130)
                        {
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim().Substring(0, dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 927);
                            e.Graphics.DrawString(dr["STRVALOR"].ToString().Trim().Substring(dr["STRVALOR"].ToString().Trim().Length - 20), fuentedetalle, xbrushes, 20, 938);
                        }
                        else
                            e.Graphics.DrawString("SON: " + dr["STRVALOR"].ToString().Trim(), fuentedetalle, xbrushes, 20, 938);

                        RectangleF recAtZero = new RectangleF(0, 0, 100, 500);
                        StringFormat formato = new StringFormat();
                        formato.FormatFlags = StringFormatFlags.DirectionVertical;
                        e.Graphics.TranslateTransform(790, 977);
                        e.Graphics.RotateTransform(180);
                        e.Graphics.DrawString(dr["STRRESOLUCION"].ToString().Trim(), fuentepequeña, xbrushes, recAtZero, formato);
                        e.Graphics.RotateTransform(-180);
                    }
                }
                #endregion
            }

        #endregion

        #region eventos
            void _print_PrintPage(object sender, PrintPageEventArgs e)
            {
                try
                {
                    if (numPaginaActual == 1)
                    {
                        imprimirPagina1(e);
                    }
                    if (numPaginaActual == 2)
                    {
                        imprimirPagina2(e);
                    }
                    if (numPaginaActual == 3)
                    {
                        imprimirPagina3(e);
                    }
                    if (numPaginaActual == 4)
                    {
                        imprimirPagina4(e);
                    }
                    if (numPaginaActual == 5)
                    {
                        imprimirPagina5(e);
                    }

                    if (numPaginas > numPaginaActual)
                    {
                        e.HasMorePages = true;
                        numPaginaActual++;
                    }
                    else
                        e.HasMorePages = false;

                }
                catch (Exception ex) { throw ex; }
            }
        #endregion
        

    }
}
